package main

import "fmt"

func main() {
	/*切片 slice
	append()
	切片又被称为动态数组,切片的长度是可以改变的
	切片由三个部分组成：指向底层数组的指针，切片的元素个数（长度），切片的容量
	引用类型
	遍历方式和数组类似，都是通过for ,for range
	*/

	//切片的定义
	var sliceVar []int
	//定义一个数组
	arrayVar := [...]int{12, 21, 23, 55, 98, 2}
	for i := 0; i < len(arrayVar); i++ {
		fmt.Printf("arrayVar[%d]=%d,地址=%p\n", i, arrayVar[i], &arrayVar[i])
	}

	//修改数组就会同步修改切片
	arrayVar[0] = 10

	//切片去引用数组 0是开始索引 索引2之前的一个数 -》0 索引 1索引 -》0,1
	sliceVar = arrayVar[1:2]
	for i, v := range sliceVar {
		fmt.Printf("sliceVar[%d]=%d,地址=%p\n", i, v, &sliceVar[i])
	}

	//切片的第二种定义方式 make
	var stringSlice = make([]string, 5, 6)
	fmt.Printf("stringSlice的长度=%d,容量=%d,\n切片指向的底层数组的地址=%p,切片自己的地址=%p\n", len(stringSlice), cap(stringSlice), stringSlice, &stringSlice)

	//第一次添加一个元素，长度5+1，刚好达到最大的容量
	stringSlice = append(stringSlice, "1")
	fmt.Printf("第一次追加stringSlice的长度=%d,容量=%d,\n切片指向的底层数组的地址=%p,切片自己的地址=%p\n", len(stringSlice), cap(stringSlice), stringSlice, &stringSlice)

	//第二次超过最大容量，就容量扩容2倍
	stringSlice = append(stringSlice, "8")
	fmt.Printf("第二次追加stringSlice的长度=%d,容量=%d,\n切片指向的底层数组的地址=%p,切片自己的地址=%p\n", len(stringSlice), cap(stringSlice), stringSlice, &stringSlice)

	//切片的copy
	sliceInt := []int{1, 2, 3, 4, 5}
	sliceInt2 := make([]int, 10)

	//copy(需要拷贝的对象，被拷贝的对象)
	copy(sliceInt2, sliceInt)
	fmt.Println(sliceInt)
	fmt.Println(sliceInt2)

	//切片是引用类型，修改传入的值，就可以改变原来数据
	fmt.Println(sliceInt)
	changeSlice(sliceInt)
	fmt.Println(sliceInt)
}

func changeSlice(slice []int) {
	slice[0] = 100
}
